home *** CD-ROM | disk | FTP | other *** search
/ Pascal Super Library / Pascal Super Library (CW International)(1997).bin / DELPHI32 / GAUGES / DBMETER / DBM.PAS < prev    next >
Pascal/Delphi Source File  |  1996-09-09  |  14KB  |  473 lines

  1. unit dbm;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,extctrls;
  7.  
  8. type Tdbmeterstyle = (dsVertical,dsHorizontal);
  9. type tdbmeterdirection = (ddRightDown,ddLeftUp);
  10.  
  11. type
  12.   Tdbmeter = class(tgraphiccontrol)
  13.   private
  14.     { Private-Deklarationen }
  15.     Fbevelstyle : Tpanelbevel;
  16.     Fbevelwidth : byte;
  17.  
  18.     fgreens,fyellows,freds : integer;
  19.     fgreenmax,fyellowmax,fredmax : integer;
  20.  
  21.     fcolors : array [1..3,false..true] of Tcolor;
  22.  
  23.     fshowjustone : boolean;
  24.     fsepwidth    : integer;
  25.     fsepcolor    : Tcolor;
  26.     fstyle       : tdbmeterstyle;
  27.     fdirection   : tdbmeterdirection;
  28.     fposition    : integer;
  29.     fbmp         : tbitmap;
  30.  
  31.     procedure setbevelstyle(val : Tpanelbevel);
  32.     procedure setbevelwidth(val : byte);
  33.  
  34.     procedure setgreencolor(val : tcolor);
  35.     procedure setgreenmax(val : integer);
  36.     procedure setgreens(val : integer);
  37.     procedure setgreenback(val : tcolor);
  38.  
  39.     procedure setyellowcolor(val : tcolor);
  40.     procedure setyellowmax(val : integer);
  41.     procedure setyellows(val : integer);
  42.     procedure setyellowback(val : tcolor);
  43.  
  44.     procedure setredcolor(val : tcolor);
  45.     procedure setredmax(val : integer);
  46.     procedure setreds(val : integer);
  47.     procedure setredback(val : tcolor);
  48.  
  49.     procedure setshowjustone(val : boolean);
  50.     procedure setsepwidth(val : integer);
  51.     procedure setsepcolor(val : tcolor);
  52.     procedure setstyle(val : Tdbmeterstyle);
  53.     procedure setdirection(val : Tdbmeterdirection);
  54.     procedure setposition(val : integer);
  55.   protected
  56.     { Protected-Deklarationen }
  57.     procedure paint;override;
  58.     function kompx(x:integer):integer;
  59.     function kompy(y:integer):integer;
  60.     function getlpos(val:integer):integer;
  61.   public
  62.     { Public-Deklarationen }
  63.     constructor create(aowner : Tcomponent);override;
  64.     destructor destroy ; override;
  65.   published
  66.     { Published-Deklarationen }
  67.     property DragCursor;
  68.     property DragMode;
  69.     property OnDragDrop;
  70.     property OnDragOver;
  71.     property OnEndDrag;
  72.     property OnMouseDown;
  73.     property OnMouseMove;
  74.     property OnMouseUp;
  75.     property Visible;
  76.  
  77.     property BevelStyle : TpanelBevel read fbevelstyle write setbevelstyle;
  78.     property BevelWidth : byte read fbevelwidth write setbevelwidth;
  79.  
  80.     property GreenColor : Tcolor read fcolors[1,true] write setgreencolor;
  81.     property Greens     : integer read fgreens write setgreens;
  82.     property GreenMax   : integer read fgreenmax write setgreenmax;
  83.     property GreenBack  : Tcolor read fcolors[1,false] write setgreenback;
  84.  
  85.     property YellowColor : Tcolor read fcolors[2,true] write setYellowcolor;
  86.     property Yellows     : integer read fYellows write setYellows;
  87.     property YellowMax   : integer read fYellowmax write setYellowmax;
  88.     property YellowBack  : Tcolor read fcolors[2,false] write setYellowback;
  89.  
  90.     property RedColor : Tcolor read fcolors[3,true] write setRedcolor;
  91.     property Reds     : integer read fReds write setReds;
  92.     property RedMax   : integer read fRedmax write setRedmax;
  93.     property RedBack  : Tcolor read fcolors[3,false] write setRedback;
  94.  
  95.     property ShowJustOne : boolean read fshowjustone write setshowjustone;
  96.     property SepWidth    : integer read fsepwidth write setsepwidth;
  97.     property SepColor    : Tcolor read fsepcolor write setsepcolor;
  98.     property Style       : tdbmeterstyle read fstyle write setstyle;
  99.     property Direction   : tdbmeterdirection read fdirection write setdirection;
  100.     property Position    : integer read fposition write setposition;
  101. end;
  102.  
  103. procedure Register;
  104.  
  105. implementation
  106.  
  107. constructor Tdbmeter.create;
  108. begin
  109.      inherited;
  110.      width              := 80;
  111.      height             := 17;
  112.      fbevelstyle        := bvlowered;
  113.      fbevelwidth        := 1;
  114.      fshowjustone       := false;
  115.      fgreens            := 3;
  116.      fcolors[1,true]    := cllime;
  117.      fcolors[2,true]    := clyellow;
  118.      fcolors[3,true]    := clred;
  119.      fcolors[1,false]   := clgray;
  120.      fcolors[2,false]   := clgray;
  121.      fcolors[3,false]   := clgray;
  122.      fyellows           := 2;
  123.      freds              := 1;
  124.      fgreenmax          := 50;
  125.      fyellowmax         := 25;
  126.      fredmax            := 25;
  127.      fsepwidth          := 1;
  128.      fsepcolor          := clsilver;
  129.      fstyle             := dshorizontal;
  130.      fdirection         := ddrightdown;
  131.      fposition          := 0;
  132.      fbmp := tbitmap.create;
  133. end;
  134.  
  135. destructor tdbmeter.destroy;
  136. begin
  137.      fbmp.free;
  138.      inherited;
  139. end;
  140.  
  141. function Tdbmeter.kompx(x:integer):integer;
  142. begin
  143.      result := (width - x)-1;
  144. end;
  145. function tdbmeter.kompy(y:integer):integer;
  146. begin
  147.      result := (height - y)-1;
  148. end;
  149.  
  150. procedure Tdbmeter.setbevelwidth(val : byte);
  151. begin
  152.      if val <> fbevelwidth then begin
  153.         if val = 0 then val := 1;
  154.         if (val > (height div 3)) or (val > (width div 3)) then val := 1;
  155.         fbevelwidth := val;
  156.         paint;
  157.      end;
  158. end;
  159.  
  160. procedure Tdbmeter.setbevelstyle(val : TPanelbevel);
  161. begin
  162.      if val <> fbevelstyle then begin
  163.         fbevelstyle := val;
  164.         paint;
  165.      end;
  166. end;
  167.  
  168. procedure Tdbmeter.setgreencolor(val : tcolor);
  169. begin
  170.      if val <> fcolors[1,true] then begin
  171.         fcolors[1,true] := val;
  172.         paint;
  173.      end;
  174. end;
  175. procedure Tdbmeter.setgreenmax(val : integer);
  176. begin
  177.      if val <> fgreenmax then begin
  178.         fgreenmax := val;
  179.         paint;
  180.      end;
  181. end;
  182. procedure Tdbmeter.setgreens(val : integer);
  183. begin
  184.      if val <> fgreens then begin
  185.         fgreens := val;
  186.         paint;
  187.      end;
  188. end;
  189. procedure Tdbmeter.setgreenback(val : tcolor);
  190. begin
  191.      if val <> fcolors[1,false] then begin
  192.         fcolors[1,false] := val;
  193.         paint;
  194.      end;
  195. end;
  196.  
  197. procedure Tdbmeter.setyellowcolor(val : tcolor);
  198. begin
  199.      if val <> fcolors[2,true] then begin
  200.         fcolors[2,true] := val;
  201.         paint;
  202.      end;
  203. end;
  204. procedure Tdbmeter.setyellowmax(val : integer);
  205. begin
  206.      if val <> fyellowmax then begin
  207.         fyellowmax := val;
  208.         paint;
  209.      end;
  210. end;
  211. procedure Tdbmeter.setyellows(val : integer);
  212. begin
  213.      if val <> fyellows then begin
  214.         fyellows := val;
  215.         paint;
  216.      end;
  217. end;
  218. procedure Tdbmeter.setyellowback(val : tcolor);
  219. begin
  220.      if val <> fcolors[2,false] then begin
  221.         fcolors[2,false] := val;
  222.         paint;
  223.      end;
  224. end;
  225.  
  226. procedure Tdbmeter.setredcolor(val : tcolor);
  227. begin
  228.      if val <> fcolors[3,true] then begin
  229.         fcolors[3,true] := val;
  230.         paint;
  231.      end;
  232. end;
  233. procedure Tdbmeter.setredmax(val : integer);
  234. begin
  235.      if val <> fredmax then begin
  236.         fredmax := val;
  237.         paint;
  238.      end;
  239. end;
  240. procedure Tdbmeter.setreds(val : integer);
  241. begin
  242.      if val <> freds then begin
  243.         freds := val;
  244.         paint;
  245.      end;
  246. end;
  247. procedure Tdbmeter.setredback(val : tcolor);
  248. begin
  249.      if val <> fcolors[3,false] then begin
  250.         fcolors[3,false] := val;
  251.         paint;
  252.      end;
  253. end;
  254.  
  255. procedure Tdbmeter.setshowjustone(val : boolean);
  256. begin
  257.      if val <> fshowjustone then begin
  258.         fshowjustone := val;
  259.         paint;
  260.      end;
  261. end;
  262. procedure Tdbmeter.setsepwidth(val : integer);
  263. begin
  264.      if val <> fsepwidth then begin
  265.         fsepwidth := val;
  266.         paint;
  267.      end;
  268. end;
  269. procedure Tdbmeter.setsepcolor(val : tcolor);
  270. begin
  271.      if val <> fsepcolor then begin
  272.         fsepcolor := val;
  273.         paint;
  274.      end;
  275. end;
  276. procedure Tdbmeter.setstyle(val : Tdbmeterstyle);
  277. begin
  278.      if val <> fstyle then begin
  279.         fstyle := val;
  280.         paint;
  281.      end;
  282. end;
  283. procedure Tdbmeter.setdirection(val : Tdbmeterdirection);
  284. begin
  285.      if val <> fdirection then begin
  286.         fdirection := val;
  287.         paint;
  288.      end;
  289. end;
  290. procedure Tdbmeter.setposition(val : integer);
  291. begin
  292.      if val <> fposition then begin
  293.         fposition := val;
  294.         paint;
  295.      end;
  296. end;
  297.  
  298. function tdbmeter.getlpos(val:integer):integer;
  299. var num : integer;
  300. var ye,gr : integer;
  301. begin
  302.      ye := fyellowmax;
  303.      if yellows = 0 then ye := 0;
  304.      gr := fgreenmax;
  305.      if greens = 0 then gr := 0;
  306.      result := 0;
  307.      if fposition >= (fredmax+gr+ye) then begin
  308.         result := val;
  309.         exit;
  310.      end;
  311.      if fposition > (ye+gr) then begin
  312.         // rote position berechnen
  313.         if reds = 0 then begin
  314.            result := val;
  315.            exit;
  316.         end;
  317.         num := fposition-ye-gr;
  318.         result := round((freds / fredmax) * num)+fgreens+fyellows;
  319.         if result = fgreens+fyellows then result := result+1;
  320.         exit;
  321.      end;
  322.      if fposition > (gr) then begin
  323.         // gelbe position berechnen
  324.         if yellows = 0 then begin
  325.            result := val;
  326.            exit;
  327.         end;
  328.         num := fposition-gr;
  329.         result := round((fyellows / ye) * num)+fgreens;
  330.         if result = fgreens then result := result+1;
  331.         exit;
  332.      end;
  333.      // grⁿne position berechnen
  334.      if gr = 0 then begin
  335.         result := 0;
  336.         exit;
  337.      end;
  338.      result := round((fgreens / gr)* fposition);
  339. end;
  340. procedure Tdbmeter.paint;
  341. var bw : byte;
  342.     tcbottom,tctop : tcolor;
  343.     lp : integer;
  344.     anz : integer;
  345.     breite,hoehe : integer;
  346.     num : integer;
  347.     akt : boolean;
  348.     farbe : byte;
  349.     x0,y0,x1,y1 : integer;
  350.     x2,y2,x3,y3 :integer;
  351. begin
  352.      fbmp.width := width;
  353.      fbmp.height := height;
  354.      with fbmp.canvas do begin
  355.           pen.color := fsepcolor;
  356.           pen.width := 0;
  357.           pen.style := pssolid;
  358.           brush.color := fsepcolor;
  359.           brush.style := bssolid;
  360.           rectangle(0,0,width,height);
  361.      end;
  362.      //anzahl der KΣstchen berechnen
  363.      anz := fgreens+freds+fyellows;
  364.      if anz > 0 then begin
  365.         // breite berechnen
  366.         breite := width div anz;
  367.         hoehe  := height;
  368.         if fstyle = dsvertical then begin
  369.            breite := height div anz;
  370.            hoehe  := width;
  371.         end;
  372.         if breite > fsepwidth then begin
  373.            // berechnen, welches element das letzte ist
  374.            num := getlpos(anz);
  375.            if num = 0 then if fposition <> 0 then num := 1;
  376.            // Farbe berechnen
  377.            fbmp.canvas.pen.width := 0;
  378.            fbmp.canvas.pen.style := pssolid;
  379.            fbmp.canvas.brush.style := bssolid;
  380.            for anz := 1 to anz do begin
  381.                akt := true;
  382.                if anz < num then if fshowjustone then akt := false;
  383.                if anz > num then akt := false;
  384.                farbe := 1;
  385.                if anz > greens+yellows then farbe := 3
  386.                else if anz > greens then farbe := 2;
  387.                fbmp.canvas.brush.color := fcolors[farbe,akt];
  388.                fbmp.canvas.pen.color   := fcolors[farbe,akt];
  389.                // positionen berechnen
  390.                case fstyle of
  391.                     dshorizontal:begin
  392.                                       x0 := (anz-1)*breite;
  393.                                       x1 := anz*breite;
  394.                                       y0 := 0;
  395.                                       y1 := hoehe-1;
  396.                                       // Strich
  397.                                       x2 := anz*breite-fsepwidth;
  398.                                       x3 := x2+fsepwidth+1;
  399.                                       y2 := 0;
  400.                                       y3 := hoehe-1;
  401.                                       if fdirection = ddleftup then begin
  402.                                          x0 := kompx(x0);
  403.                                          x1 := kompx(x1);
  404.                                          x2 := kompx(x2);
  405.                                          x3 := kompx(x3);
  406.                                       end;
  407.                                  end;
  408.                dsvertical: begin
  409.                          y0 := (anz-1)*breite;
  410.                          y1 := anz*breite;
  411.                          x0 := 0;
  412.                          x1 := hoehe-1;
  413.                          // Strich
  414.                          y2 := anz*breite-fsepwidth;
  415.                          y3 := y2+fsepwidth+1;
  416.                          x2 := 0;
  417.                          x3 := hoehe-1;
  418.                          if fdirection = ddleftup then begin
  419.                             y0 := kompy(y0);
  420.                             y1 := kompy(y1);
  421.                             y2 := kompy(y2);
  422.                             y3 := kompy(y3);
  423.                          end;
  424.                          end;
  425.                end;
  426.                // Rechteck ausgeben
  427.                fbmp.canvas.rectangle(x0,y0,x1,y1);
  428.                if sepwidth > 0 then begin
  429.                   fbmp.canvas.brush.color := fsepcolor;
  430.                   fbmp.canvas.pen.color := fsepcolor;
  431.                   fbmp.canvas.rectangle(x2,y2,x3,y3);
  432.                end;
  433.            end;
  434.         end;
  435.      end;
  436.  
  437.      tcbottom := clwhite;
  438.      tctop := clgray;
  439.      bw := fbevelwidth;
  440.      if fbevelstyle = bvnone then bw := 0;
  441.      if (bw > (height div 3)) or (bw > (width div 3)) then bw := 1;
  442.      if bw > 0 then begin
  443.         if fbevelstyle = bvraised then begin
  444.            tcbottom := clgray;
  445.            tctop := clwhite;
  446.         end;
  447.         with fbmp.canvas do begin
  448.              pen.color := tcbottom;
  449.              // unten rechts;
  450.              for lp := 0 to bw-1 do begin
  451.                  moveto(kompx(width),kompy(lp));
  452.                  lineto(kompx(lp),kompy(lp));
  453.                  lineto(kompx(lp),kompy(height));
  454.              end;
  455.              pen.color := tctop;
  456.              // obenlinks;
  457.              for lp := 0 to bw-1 do begin
  458.                  moveto(width,lp);
  459.                  lineto(lp,lp);
  460.                  lineto(lp,height-bw);
  461.              end;
  462.         end;
  463.      end;
  464.      canvas.draw(0,0,fbmp);
  465. end;
  466.  
  467. procedure Register;
  468. begin
  469.   RegisterComponents('Samples', [Tdbmeter]);
  470. end;
  471.  
  472. end.
  473.